#include <GL/gl.h>
#include <GL/glut.h>
#include <math.h>

#include "Territoire.h"
#include "Joueur.h"



using namespace std;

Territoire::Territoire() {
	
	nbArmee = 0;
	ameliore = false;

	couleurOrigine[0]=1.0f;
	couleurOrigine[1]=1.0f;
	couleurOrigine[2]=1.0f;

	couleurCourante[0]=1.0f;
	couleurCourante[1]=1.0f;
	couleurCourante[2]=1.0f;

	couleurSelection[0]=1.0f;
	couleurSelection[1]=1.0f;
	couleurSelection[2]=1.0f;

	couleurAttaque[0]=1.0f;
	couleurAttaque[1]=1.0f;
	couleurAttaque[2]=1.0f;

	position[0]=0.0f;
	position[1]=0.0f;
	position[2]=0.0f;

	scale[0] = 13.0f;
	scale[1] = 13.0f;
	scale[2] = 13.0f;

}

Territoire::Territoire(string nom) {
	this->nom = nom;
	nbArmee = 0;
	ameliore = false;

	couleurOrigine[0]=1.0f;
	couleurOrigine[1]=1.0f;
	couleurOrigine[2]=1.0f;

	couleurCourante[0]=1.0f;
	couleurCourante[1]=1.0f;
	couleurCourante[2]=1.0f;

	couleurSelection[0]=0.2f;
	couleurSelection[1]=0.2f;
	couleurSelection[2]=0.8f;

	couleurAttaque[0]=1.0f;
	couleurAttaque[1]=1.0f;
	couleurAttaque[2]=1.0f;

	position[0]=0.0f;
	position[1]=0.0f;
	position[2]=0.0f;

	scale[0] = 13.0f;
	scale[1] = 13.0f;
	scale[2] = 13.0f;
	
}

void Territoire::setId(int i) {
	id = i;
}

int Territoire::getId() {
	return id;
}

Joueur* Territoire::getPropretaire() {
	return proprietaire;
}

void Territoire::setProprietaire(Joueur* proprietaire) {
	this->proprietaire = proprietaire;
	//couleurSelection[1]=proprietaire->couleur[1] - 0.3;
}

int Territoire::getNbArmee() {
	return nbArmee;
}

void Territoire::setNbArmee(int nbArmmee) {
	this->nbArmee = nbArmmee;
}

string Territoire::getNom() {
	return nom;
}

void Territoire::setNom(string nom) {
	this->nom = nom;
}

bool Territoire::ajouterArmee() {
	
	// Recuperation du proprio
	Joueur* joueur = this->getPropretaire();
	int nbArmeeDisponible = joueur->getNbArmeeDisponible();
	int nbArmeePlace = joueur->getNbArmeePlace();
	
	// Si le joueur a encore des armees disponibles 
	if (nbArmeeDisponible > 0) {	
		
		// On ajoute une armee sur le territoire
		nbArmee++;
		nbArmeePlace++;
		nbArmeeDisponible--;
		
		joueur->setNbArmeeDisponible(nbArmeeDisponible);
		joueur->setNbArmeePlace(nbArmeePlace);
		
		// Flag de notification d'amelioration
		ameliore = true;
		
		return true;
	}
	else {
		return false;
	}	
}

bool Territoire::retirerArmee() {
	
	// Recuperation du proprio
	Joueur* joueur = this->getPropretaire();
	int nbArmeeDisponible = joueur->getNbArmeeDisponible();
	int nbArmeePlace = joueur->getNbArmeePlace();
			
	if (nbArmee > 1) {
		nbArmee--;
		nbArmeeDisponible++;
		nbArmeePlace--;
		
		joueur->setNbArmeeDisponible(nbArmeeDisponible);
		joueur->setNbArmeePlace(nbArmeePlace);
		
		// Flag de notification d'amelioration
		ameliore = true;
				
		
		return true;
	}
	else {
		return false;
	}
}

void Territoire::afficher() {
	cout<<"- "<<this->nom<<" - nb armee = "<<this->nbArmee<<endl;
}


/**************************************************
 * Fonction OpenGL
 * 
 *
 ***************************************************/

void Territoire::draw() {

	float angle;
	int i;
	int j;
	int nbPoint = 100;
	float PI = 3.141592;
	float xCercle[100];
	float yCercle[100];
	char strMsg[15] = { 0 };
	char strMsgArg[] = "";

	for (j=0; j < nbPoint; j++) {

		angle = j * 2 * PI / nbPoint;

		xCercle[j] = cos(angle);
		yCercle[j] = sin(angle);
	}

	glPushMatrix();

	glTranslatef(position[0], position[1], position[2]);
	glScalef(scale[0], scale[1], scale[2]);

	glBegin(GL_POLYGON);
	glColor3f(0.5, 0.5, 0.5);

	for (i = 0; i < nbPoint; i++) {
		glVertex3f(xCercle[i], yCercle[i], 0);
	}

	glEnd();
	glColor3f(0.0, 0.0, 0.0);

	glRasterPos3f(-0.4f, -0.4f, 1.);
	
	sprintf(strMsg, "%d", nbArmee);
	if (nbArmee!=0) {		
		for (unsigned int i=0; i<strlen(strMsg); i++)
			glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18,*(strMsg+i));
	}
	
	glBegin(GL_POLYGON);	
	glColor3fv(couleurCourante);

	for (i = 0; i < nbPoint; i++) {
		glVertex3f(xCercle[i], yCercle[i], 1);
	}

	glEnd();

	glBegin(GL_POLYGON);
	glColor3f(0.5, 0.5, 0.5);

	for (i = 0; i < nbPoint; i++) {
		glVertex3f(xCercle[i], yCercle[i], 0);
		glVertex3f(xCercle[i], yCercle[i], 1);
	}

	glEnd();
	glPopMatrix();
}


void Territoire::setPosition(float x, float y, float z) {
	position[0]=x;
	position[1]=y;
	position[2]=z;
}

void Territoire::setScale(float x, float y, float z) {
	scale[0] = x;
	scale[1] = y;
	scale[2] = z;
}

void Territoire::setCouleurCourante(float _couleurCourante[3]) {
	this->couleurCourante[0] = _couleurCourante[0];
	this->couleurCourante[1] = _couleurCourante[1];
	this->couleurCourante[2] = _couleurCourante[2];		
}
  
void Territoire::setCouleurOrigine(float _couleurOrigine[3]) {

	this->couleurOrigine[0] = _couleurOrigine[0];
	this->couleurOrigine[1] = _couleurOrigine[1];
	this->couleurOrigine[2] = _couleurOrigine[2];
		
	this->couleurCourante[0] = _couleurOrigine[0];
	this->couleurCourante[1] = _couleurOrigine[1];
	this->couleurCourante[2] = _couleurOrigine[2];		
}

void Territoire::setCouleurOrigine(float r, float g, float b) {
	
	this->couleurOrigine[0]=r;
	this->couleurOrigine[1]=g;
	this->couleurOrigine[2]=b;
	
	this->couleurCourante[0] = r;
	this->couleurCourante[1] = g;
	this->couleurCourante[2] = b;		
}


